﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataAccess;
using DataAccess.Datatypes;
using BussinesLayer;
using DataModel;

namespace BussinesLayer.Services
{
    public class GoodServices
    {
        private GoodManager _good = new GoodManager();

        //Devuelve todos los bienes
        public IEnumerable<Good> GetGoods(int siteId)
        {
            return _good.GetGoods(siteId);
        }

        //Devuelve los n bienes mejor valorados de un sitio
        public IEnumerable<Good> GetBestGoodsHome(int siteId)
        {
            return _good.GetBestGoodsHome(siteId);
        }

        //Devuelve los n bienes mejor valorados de un sitio
        public IEnumerable<Good> GetBestGoods(int siteId, int n)
        {
            return _good.GetBestGoods(siteId, n);
        }

        //Devuelve los bienes de un usuario
        public IEnumerable<Good> GetUserGoods(int siteId, int userId)
        {
            return _good.GetUserGoods(siteId, userId);
        }

        //Devuelve el bien solicitado para editar
        public Good GetGoodEdit(int goodId, int userId, int siteId)
        {
            return _good.GetGoodEdit(goodId, userId, siteId);
        }

        //Devuelve el bien solicitado para cualquier usuario
        public Good GetGood(int goodId, int userId)
        {
            return _good.GetGood(goodId, userId);
        }

        //Devuelve los períodos de no disponibilidad del bien
        public IEnumerable<NotAvailable> GetGoodAvailability(int goodId)
        {
            return _good.GetGoodAvailability(goodId);
        }

        public ICollection<SiteAttributeSet> GetSiteAttributes(int siteId)
        {
            return _good.GetSiteAttributes(siteId);
        }

        //Devuelve la imagen del bien soliciado
        public byte[] GetGoodImage(int goodId)
        {
            return _good.GetGoodImage(goodId);
        }

        //Devuelve la imagen del bien soliciado
        public byte[] GetGoodBigImage(int goodId)
        {
            return _good.GetGoodBigImage(goodId);
        }

        //Agrega un bien
        public void AddGood(int siteId, int userId, string name, byte[] image, byte[] bigImage, decimal priceDay, decimal latitude, decimal longitude)
        {
            _good.AddGood(siteId, userId, name, image, bigImage, priceDay, latitude, longitude);
        }

        //Agrega un atributo a un bien
        public void AddAttribute(int goodId, int siteAttributeId, string value)
        {
            _good.AddAttribute(goodId, siteAttributeId, value);
        }

        //Agrega un contenido a un bien
        public void AddContent(int goodId, string url, string comment, System.DateTime date, int userId)
        {
            _good.AddContent(goodId, url, comment, date, userId);
        }

        //Agrega un like a un bien
        public void AddLike(int goodId, int userId)
        {
            _good.AddLike(goodId, userId);
        }

        //Remueve un like a un bien
        public void RemoveLike(int goodId, int userId)
        {
            _good.RemoveLike(goodId, userId);
        }

        //Agrega una marca de inapropiado a un contenido
        public void AddInnapropiate(int contentId, int userId)
        {
            _good.AddInnapropiate(contentId, userId);
        }

        //Modifica un bien
        public void ModifyGood(int id, string name, byte[] image, byte[] bigImage, decimal priceDay, decimal latitude, decimal longitude)
        {
            _good.ModifyGood(id, name, image, bigImage, priceDay, latitude, longitude);
        }

        //Realiza una busqueda de un bien segun los criterios especificados
        public IEnumerable<Good> SearchGoods(int siteId, string criterion, DateTime start, DateTime finish)
        {
            return _good.SearchGoods(siteId, criterion, start, finish);
        }

        //Agrega un periodo de no disponibilidad al bien
        public void SetNotAvailable(int goodId, DateTime start, DateTime finish)
        {
            _good.SetNotAvailable(goodId, start, finish);
        }

        //Agrega un periodo de renta al bien, pendiente de confirmacion
        public Good RentGood(int userId, int goodId, DateTime start, DateTime finish)
        {
            return _good.RentGood(userId, goodId, start, finish);
        }

        //Confirma la renta de un bien
        public void RentConfirmation(string token)
        {
            _good.RentConfirmation(token);
        }

    }
}
